package database

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"shop/config"
	"shop/model"
)

var _db *gorm.DB

func init() {

	// 拼接下 dsn 参数, dsn 格式可以参考上面的语法，这里使用 Sprintf 动态拼接 dsn 参数，因为一般数据库连接参数，我们都是保存在配置文件里面，需要从配置文件加载参数，然后拼接 dsn。
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s",
		config.DbUser, config.DbPassWord, config.DbHost, config.DBPort, config.DbName, config.DbTimeOut)

	// 声明 err 变量，下面不能使用 := 赋值运算符，否则_db变量会当成局部变量，导致外部无法访问 _db 变量
	var err error
	// 连接 Mysql, 获得DB类型实例，用于后面的数据库读写操作。
	_db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}

	sqlDB, _ := _db.DB()
	// 设置数据库连接池参数
	sqlDB.SetMaxOpenConns(config.MaxOpenConns) // 设置数据库连接池最大连接数
	sqlDB.SetMaxIdleConns(config.MaxIdleConns) // 连接池最大允许的空闲连接数
	// 可以通过Set设置附加参数，下面设置表的存储引擎为InnoDB，model.User支持自动建表
	_db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&model.User{})
}

func GetDB() *gorm.DB {
	return _db
}
